package com.yxt.common.download;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;

public class MultiThreadDownload extends Thread {

	private static final int BUFFER_SIZE = 1024;

	private int blockSize;

	private int threadNum = 5;

	private int fileSize;

	private int downloadedSize;

	String urlStr, threadNo, fileName;

	private String savePath;

	private int downloadPercent = 0, downloadSpeed = 0, usedTime = 0;

	private long startTime, curTime;

	private boolean completed = false;

	public MultiThreadDownload(String URL, String savePath, String fileName) {
		this.urlStr = URL;
		this.savePath = savePath;
		this.fileName = fileName;
	}

	@Override
	public void run() {
		FileDownloadThread[] fds = new FileDownloadThread[threadNum];
		try {
			URL url = new URL(urlStr);
			URLConnection conn = url.openConnection();
			fileSize = conn.getContentLength();
			blockSize = fileSize / threadNum;
			File file[] = new File[threadNum];

			for (int i = 0; i < threadNum; i++) {
				file[i] = new File(savePath + fileName + ".part"
						+ String.valueOf(i));
				FileDownloadThread fdt = new FileDownloadThread(url, file[i], i
						* blockSize, (i + 1) != threadNum ? ((i + 1)
						* blockSize - 1) : fileSize);
				fdt.setName("Thread" + i);
				fdt.start();
				fds[i] = fdt;
			}

			startTime = System.currentTimeMillis();
			boolean finished = false;
			while (!finished) {
				downloadedSize = 0;
				finished = true;
				for (int i = 0; i < fds.length; i++) {
					downloadedSize += fds[i].getDownloadSize();
					if (!fds[i].isFinished()) {
						finished = false;
					}

				}

				downloadPercent = (downloadedSize * 100) / fileSize;
				curTime = System.currentTimeMillis();
				usedTime = (int) ((curTime - startTime) / 1000);
				if (usedTime == 0)
					usedTime = 1;

				downloadSpeed = (downloadedSize / usedTime) / 1024;
				sleep(1000);

			}
			completed = true;
			RandomAccessFile raf = new RandomAccessFile(savePath + fileName,
					"rw");
			byte[] tempbytes = new byte[BUFFER_SIZE];
			InputStream in = null;
			int byteread = 0;
			for (int i = 0; i < threadNum; i++) {
				in = new FileInputStream(file[i]);
				while ((byteread = in.read(tempbytes)) != -1) {
					raf.write(tempbytes, 0, byteread);

				}
				in.close();
				file[i].delete();
			}
			raf.close();
		} catch (Exception e) {
		}

	}

	public int getDownloadPercent() {
		return this.downloadPercent;
	}

	public int getDownloadSpeed() {
		return this.downloadSpeed;
	}

	public void setThreadNum(int threadNum) {
		this.threadNum = threadNum;
	}

	public boolean isCompleted() {
		return this.completed;
	}

}
